热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

首部|目的地_公网传输技术之SRT协议解析(下)

篇首语:本文由编程笔记#小编为大家整理,主要介绍了公网传输技术之SRT协议解析(下)相关的知识,希望对你有一定的参考价值。作者

篇首语:本文由编程笔记#小编为大家整理,主要介绍了公网传输技术之SRT协议解析(下)相关的知识,希望对你有一定的参考价值。




作者:张博力


编辑:Alex


▼扫描下图二维码了解音视频技术大会更多信息▼

摘  要: 本文从SRT协议的工作流程谈起,着重介绍和解析了SRT协议的数据包结构,并举例说明如何利用Wireshark抓包软件进行链路故障分析,从而解决实际工作中的问题。

引  言

SRT(Secure Reliable Transport)协议即安全可靠传输协议,是一种新兴的视音频传输协议,能够在公共互联网环境下实现高质量低延时的实时视音频传输。

公网传输技术之SRT协议解析(上)着重讨论了如何衡量SRT协议的可靠程度,以及如何在不同应用场景下配置SRT链路的参数。本文作为下篇,将从SRT协议的工作流程入手,对SRT协议的数据包结构进行解析,之后举例介绍如何利用Wireshark软件进行抓包分析,从而排除链路故障或者获取链路信息。


1、SRT协议工作流程

SRT协议中最常用的工作模式为**“呼叫-监听”(Caller-Listener)**模式,监听方(Listener)会持续监听本方的固定UDP端口,呼叫方(Caller)通过访问监听方的公网IP地址和该固定端口来建立SRT连接。呼叫和监听的角色主要在SRT协议握手阶段起作用,无论是编码端还是解码端都可以担任呼叫者或监听者的角色。

图1表示了SRT协议的工作流程,整个流程包括握手、参数交换、数据传输、连接关闭等步骤。另外在传输有效数据时,双方会发送控制数据来完成丢包恢复、连接保持等功能。

图1  SRT协议工作流程


2、SRT数据包结构

SRT协议根据 UDT协议(UDP-based Data Transfer Protocol) 改进而来,已经在2020年3月10日向IETF提交了RFC草案,这也表示SRT协议进入了比较稳定的发展轨道。

众所周知,SRT的传统优势领域是点对点的实时音视频传输,而近两年,SRT协议在上行推流方面有了迅速的发展,很多主流平台和公司都支持使用SRT协议来代替RTMP协议进行上行推流,其中的关键点就是SRT的StreamID功能,而StreamID功能就包含在SRT握手数据包的配置扩展模块中。

总的来说,SRT协议中包含两类数据包:信息数据包(Data Packet)和控制数据包(Control Packet),他们通过SRT首部的最高位(标志位)来区分,0代表信息数据包,1代表控制数据包。控制数据包又包含了 握手(Handshake)、肯定应答(ACK)、否定应答(NAK)、对肯定应答的应答(ACKACK),保持连接(Keepalive)、关闭连接(Shutdown) 等多种类型。

2.1 信息数据包结构

图2展示了SRT信息数据包的结构,其承载了需要传输的有效数据。SRT首部长度为16字节,最高位为标志位,SRT信息数据包首部包含四个区域:数据包序列号、报文序号、时间戳、目的地端套接字ID


  • 数据包序列号:SRT使用基于序列号的数据包发送机制,发送端每发送一个数据包,数据包序列号加1。

  • 报文序号:报文序号独立计数,在它之前设置了四个标志位(见图2)。

  • 时间戳:以连接建立时间点(StartTime)为基准的相对时间戳,单位为微秒。

  • 目的地端套接字ID:在多路复用时用来区分不同的SRT流。

图2  SRT信息数据包

2.2 握手数据包结构

握手数据包分为HSv4版本&#xff08;SRT版本<1.3&#xff09;和HSv5版本&#xff08;SRT版本>&#61;1.3&#xff09;&#xff0c;图3为HSv5版本握手数据包的结构&#xff0c;HSv5握手数据包主要包含五个区域&#xff1a;SRT首部、握手控制信息&#xff08;cif.hsv5&#xff09;、握手请求/响应扩展模块&#xff08;hsreg/hsrsp&#xff09;、加密扩展模块&#xff08;kmreg/kmrsp&#xff09;、配置扩展模块&#xff08;config&#xff09;。这里重点介绍前三个区域&#xff0c;握手数据包的结构参见图3:

图3  HSv5握手数据包

1. 所有SRT控制数据包的首部是基本相同的&#xff0c;均包含四个区域&#xff1a;控制类型和保留区域、附加信息、时间戳、目的地端套接字&#xff0c;其中控制类型字段为0代表握手数据包

2. 握手控制信息区域&#xff08;cif.hsv5&#xff09;中比较重要的字段如下&#xff1a;


  • ISN&#xff1a;随机生成的数据包初始序列号&#xff0c;之后所有的信息数据包以此为基准计数。

  • 握手类型&#xff1a;该字段第一个作用是表示该握手数据包所处的握手阶段&#xff08;以“呼叫-监听”模式为例&#xff0c;其握手分为诱导阶段Induction和结尾阶段Conclusion&#xff09;&#xff0c;第二个作用对于用户来说更为重要&#xff0c;在握手失败后“握手类型”字段会显示相应的错误码&#xff0c;错误码所对应的错误类型见表1。


错误码

错误类型

错误码

错误类型

1000

未知原因

1008

对端版本过旧

1001

系统功能错误

1009

集合模式套接字冲突

1002

对端拒绝

1010

密码错误

1003

资源分配问题

1011

需要密码

1004

握手中的错误数据

1012

Stream标志位冲突

1005

监听方Backlog溢出

1013

拥塞控制类型冲突

1006

内部程序错误

1014

包过滤器冲突

1007

该套接字已关闭

1015

组冲突

表1 错误码和错误类型对应表1


  • SRT套接字ID&#xff1a;该字段需要和SRT首部中的目的地端套接字ID加以区分&#xff0c;该字段只作用于握手阶段&#xff0c;而目的地端套接字ID作用于数据传输全过程。

  • 同步COOKIE&#xff1a;在“呼叫-监听”模式下&#xff0c;出于防止DoS攻击的目的&#xff0c;只由监听方生成同步COOKIE&#xff0c;该COOKIE由监听方的主机、端口和当前时间生成&#xff0c;精确度为1分钟。

3. 握手请求扩展模块&#xff08;HSREG&#xff09;中比较重要的字段如下&#xff1a;


  • SRT版本&#xff1a;只要有任何一方的SRT版本低于1.3&#xff0c;双方就会以HSv4版本握手方式来建立连接&#xff0c;HSv4方式握手会有三次或四次往返&#xff0c;而最新的HSv5握手只需要两次往返。出于兼容性的考虑&#xff0c;即使双方的SRT版本都高于1.3&#xff0c;第一个握手请求信息也是HSv4格式。

  • SRT标志位&#xff1a;共有8位标志位&#xff0c;来实现SRT的不同模式和功能。

  • 发送方向延时和接收方向延时&#xff1a;SRT协议1.3版本实现了双向传输功能&#xff0c;双向传输可以分别设定不同方向的固定延时。对于常规的单向传输&#xff0c;假设A向B发送数据&#xff0c;该方向的延时量Latency应该是A的发送方向延时&#xff08;PeerLatency&#xff09;和B的接收方向延时&#xff08;RecLatency&#xff09;的最大值&#xff0c;该延时量在握手阶段就已由双方协商确定。在单向传输时&#xff0c;有一些编解码器将它的PeerLatency和RecLatency设置成统一的值&#xff0c;这种简易设置方法并不会影响单向传输的工作。

4. 加密扩展模块KMREQ和配置扩展模块CONFIG


  • 由于篇幅的原因&#xff0c;最后两个非必需的扩展模块不再详细讨论。其中加密扩展模块&#xff08;KMREQ&#xff09;主要负责SRT的AES128/AES192/AES256加密功能的实现。而配置扩展模块&#xff08;CONFIG&#xff09;包含了四种&#xff1a;SRT_CMD_SID、SRT_CMD_CONGESTION、SRT_CMD_FILTER、SRT_CMD_GROUP&#xff0c;其中SRT_CMD_SID扩展模块就是负责SRT上行推流中不可或缺的StreamID功能&#xff0c;有兴趣的朋友可以自行抓包查看。

2.3 ACK数据包结构

ACK数据包是由SRT接收端反馈给发送端的肯定应答&#xff0c;发送端收到ACK后便会认为相应数据包已经成功送达。ACK数据包中还包含了接收端估算的链路数据&#xff0c;可以作为发送端拥塞控制的参考。ACK数据包结构见图4&#xff0c;其中几个比较重要的字段如下&#xff1a;

图4 ACK控制数据包


  • 控制类型&#xff1a;该字段等于2便表示ACK数据包。

  • 附加信息&#xff1a;其中包含了独立计数的ACK序列号&#xff0c;该序列号主要用于ACK包和ACKACK包的一一对应。

  • 最近一个已接收数据包的序列号&#43;1&#xff1a;该字段的值等于最近一个已收到的信息数据包的序列号加1&#xff0c;例如ACK包中该字段为6&#xff0c;便表示前5个数据包均已收到&#xff0c;发送端可以将它们从缓冲区中踢出。需要注意本字段是和数据包序列号有关&#xff0c;与ACK序列号无关。

  • 往返时延RTT估值&#xff1a;通过ACK数据包和ACKACK数据包估算出的链路往返时延。

  • 往返时延RTT估值的变化量&#xff1a;该变化量能够衡量RTT的波动程度&#xff0c;数值越大表示链路RTT越不稳定。

  • 接收端可用缓冲数据&#xff1a;表示目前接收端缓冲区有多少缓冲数据可供解码&#xff0c;该数值越大越好&#xff0c;其最大值由延时量参数&#xff08;Latency&#xff09;决定。

  • 链路带宽估值&#xff1a;对本次链路带宽的估算值。

  • 接收速率估值&#xff1a;接收端下行网络带宽的估算值。

2.4 NAK数据包结构

当SRT接收端发现收到的数据包序列号不连续时&#xff0c;便会判断有数据包丢失&#xff0c;并立刻向发送方回复否定应答&#xff08;NAK&#xff09;数据包。此外SRT接收端还会以一定间隔发送周期NAK报告&#xff0c;其中包括了间隔期的所有丢失包序列号&#xff0c;这种重复发送NAK的机制主要为了防止NAK数据包在反向传输中丢失。NAK数据包结构见图5&#xff0c;其控制类型字段等于3&#xff0c;包内含有丢失数据包的序列号列表。

图5 NAK控制数据包

2.5 ACKACK数据包结构

ACKACK的主要作用是用来计算链路的往返时延&#xff08;RTT&#xff09;&#xff0c;而RTT作为重要的链路信息会包含在ACK数据包中&#xff0c;ACKACK数据包结构参见图6。首先ACK数据包和ACKACK数据包都包含有精准的时间戳和ACK序列号&#xff0c;当发送端传输给接收端ACK数据包时&#xff0c;接受端会立刻返回一个ACKACK数据包&#xff0c;之后发送端会根据“ACK序列号”将ACK包和ACKACK包一一对应起来&#xff0c;并通过将他们的时间戳相减从而得到链路的往返时延&#xff08;RTT&#xff09;。

图6 ACKACK数据包结构

2.6 连接保持和连接关闭数据包结构

SRT中最后两个数据包类型是连接保持&#xff08;Keepalive&#xff09;数据包和连接关闭&#xff08;Shutdown&#xff09;数据包&#xff0c;它们的数据包结构参见图7和图8。

图7 连接保持数据包结构

图8 连接关闭数据包结构


3、Wireshark抓包分析

Wireshark是被业界广泛使用的开源数据包分析软件&#xff0c;它可以截取各类网络数据包&#xff0c;并显示数据包的详细信息。随着广电行业IP化的不断推进&#xff0c;Wireshark的使用也越来越频繁&#xff0c;其重要性可类比于波形监视器对于SDI信号的作用&#xff0c;以及码流分析仪对于TS流信号的作用。

下面列举了两个利用Wireshark软件进行链路分析的例子&#xff1a;

3.1 场景一 连接失败

在SRT链路的搭建过程中&#xff0c;难免会遇到连接失败的情况&#xff0c;其原因是多种多样的&#xff0c;这时我们便可以利用Wireshark的抓包分析功能来判断错误的类型。

图9是连接失败后的抓包数据&#xff0c;抓包视频可参见下方视频。首先可以观察到双方在不停的交换握手数据包&#xff0c;说明握手没有成功&#xff0c;但另一方面也说明IP地址和端口号是设置正确的&#xff0c;双方能够正常通信。

在双方SRT版本都高于1.3的情况下&#xff0c;SRT握手过程需要两次往返&#xff0c;既有四个握手数据包&#xff0c;并且第一个握手数据包一定是HSv4版本握手数据包&#xff0c;由此我们可以定位出第一个握手数据包。接着观察到第四个握手数据包的“Handshake Type”字段是1002-Reject&#xff0c;含义是“对端拒绝”&#xff0c;这表示双方可能在某个参数上不匹配而导致了握手失败。

我们接着查看第二个握手包&#xff0c;这是监听方发给呼叫方的响应&#xff0c;其中“Encryption Field”区域为AES-128&#xff0c;即要求对方以AES-128的方式响应加密。再查看第三个握手包&#xff0c;这是呼叫方发给监听方的&#xff0c;其中“Extended Field”区域的KMREQ模块为NOT&#xff0c;表示该握手包没有加密扩展模块&#xff0c;即没有响应对方的加密要求

经过以上的分析&#xff0c;我们可以得知这次连接失败是因为Listener方要求对端以AES-128的方式响应加密要求&#xff0c;而Caller方并没有做出加密的响应。如果要成功连接&#xff0c;我们就需要获知Listener方的加密密码&#xff0c;并在Caller方选择AES-128的加密方式。

图9 场景一&#xff1a;通过抓包分析找出故障原因

3.2 场景二 获取链路信息

互联网链路中单次往返时延&#xff08;RTT-Round Trip Time&#xff09; 表示了数据在发送端和接收端之间往返一次花费的时间。链路的RTT值以及RTT的波动程度决定了SRT链路延时量参数的设置&#xff0c;但实际工作中由于防火墙等原因往往难以直接获得RTT值&#xff0c;这时我们可以通过Wireshark软件对ACK数据包进行分析来获得相应信息。

通过图10可以看到&#xff0c;链路的RTT是20.61毫秒&#xff0c;而RTT的变化量是9.786毫秒&#xff0c;这也说明了该条链路的RTT并不稳定&#xff0c;而RTT波动意味着丢包重传需要的时间也会随之波动&#xff0c;从而带来整条SRT链路差错控制能力的波动&#xff0c;这也意味着我们必须依照该条链路的特性进行参数调整。

图10 场景二&#xff1a;RTT估值和RTT估值的变化量


总  结

SRT协议由于其优异的性能、较低的软硬件要求、开源免费的特性&#xff0c;在各个领域的应用越来越广泛&#xff0c;最近两年在上行推流方面也有了长足的发展。掌握好SRT协议的数据包结构能够帮助我们使用抓包软件进行故障分析和判断&#xff0c;从而快速准确地解决实际工作中出现的问题&#xff0c;希望本文能够给大家带来一些帮助&#xff0c;也欢迎大家讨论和交流。

参考文献:

&#xff3b;1&#xff3d;https://datatracker.ietf.org/doc/html/draft-sharabayko-mops-srt/

&#xff3b;2&#xff3d;SRT Protocol Technical Overview&#xff3b;M/OL&#xff3d;.(2018-10) [2020-07]. https://www3.haivision.com/e/38322/srt-tech/8mwjcv/1293755769?h&#61;XZ8B52VndjJ2-4BgYxY0yd2XSxpPXDU78YojBOTOmMs

&#xff3b;3&#xff3d;https://github.com/Haivision/srt/blob/master/docs/API.md

&#xff3b;4&#xff3d;SRT Deployment Guide,v1.1,Issue 01&#xff3b;M/OL&#xff3d;.(2018-10) [2020-07].www3.haivision.com/srt-alliance-guide.

延伸阅读&#xff1a;

公网传输技术之SRT协议解析(上)

作者简介&#xff1a;

张博力&#xff0c;安徽广播电视台工程师。
















创作打卡挑战赛


赢取流量/现金/CSDN周边激励大奖


推荐阅读
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Firefox火狐浏览器关闭到http://detectportal.firefox.com的流量问题解决办法
    本文介绍了使用Firefox火狐浏览器时出现关闭到http://detectportal.firefox.com的流量问题,并提供了解决办法。问题的本质是因为火狐默认开启了Captive portal技术,当连接需要认证的WiFi时,火狐会跳出认证界面。通过修改about:config中的network.captive-portal-service.en的值为false,可以解决该问题。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
author-avatar
顽童0006_648
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有